package com.ecommerce.dddmodules.ordercontext.service;

import com.ecommerce.dddmodules.ordercontext.model.CustomerOrder;
import com.ecommerce.dddmodules.ordercontext.repository.CustomerOrderRepository;
import com.ecommerce.dddmodules.sharedkernel.events.ApplicationEvent;
import com.ecommerce.dddmodules.sharedkernel.events.EventBus;

import java.util.HashMap;
import java.util.Map;
/**
 * @packageName: ordercontext.service（订单上下文.服务包）
 * @className: CustomerOrderService(客户订单服务实现)
 * @description: 实现订单服务接口
 * @author: luds
 * @version: v1.0
 * @date: 2021-04/01
 */
public class CustomerOrderService implements OrderService {
	/**
	 * 订单准备装运事件
	 */
	public static final String EVENT_ORDER_READY_FOR_SHIPMENT = "OrderReadyForShipmentEvent";

	/**
	 * 客户订单存储库
	 */
	private CustomerOrderRepository orderRepository;

	/**
	 * 事件总线
	 */
	private EventBus eventBus;

	/**
	 * 下订单
	 * @param order 订单
	 */
	@Override
	public void placeOrder(CustomerOrder order) {
		// 首先保存订单
		this.orderRepository.saveCustomerOrder(order);
		// 创造有效载荷量保存空间
		Map<String, String> payload = new HashMap<>();

		// 将下的订单ID保存到此空间中，
		payload.put("order_id", String.valueOf(order.getOrderId()));

		// 把保存有订单ＩＤ的有效载荷量保存空间，导入到应用事件
		ApplicationEvent event = new ApplicationEvent(payload) {
			@Override
			public String getType() {
				return EVENT_ORDER_READY_FOR_SHIPMENT;
			}
		};
		// 把应用事件发布到事件总线
		this.eventBus.publish(event);
	}

	/**
	 * 获取事件总线
	 * @return 返回事件总线
	 */
	@Override
	public EventBus getEventBus() {
		return eventBus;
	}

	/**
	 * 设置事件总线
	 * @param eventBus 事件总线
	 */
	@Override
	public void setEventBus(EventBus eventBus) {
		this.eventBus = eventBus;
	}

	/**
	 * 设置订单存储库
	 * @param orderRepository 订单存储库
	 */
	public void setOrderRepository(CustomerOrderRepository orderRepository) {
		this.orderRepository = orderRepository;
	}
}
